﻿namespace Calendar
{
    //输出日历，并对当年的
    internal class Program
    {
        const int width = 40;
        const int height = 10;
        static void Main(string[] args)
        {
            Console.WriteLine("请输入年份：");
            int nYear = int.Parse(Console.ReadLine());
            //定义光标变量
            int x = 0, y = 0;
            //进行循环，直到年数变成下一年
            //定义循环数天为days
            for (DateTime days = new DateTime(nYear, 1, 1); days.Year == nYear; days = days.AddDays(1))
            {
                //计算这一天是周几
                int DoW = (int)days.DayOfWeek;
                //对每月的第一天
                if (days.Day == 1)
                {
                    x = ((days.Month - 1) % 3) * width;
                    y = ((days.Month - 1) / 3) * height;
                    Console.SetCursorPosition(x, y);
                    Console.Write($"           {days.Month}月");
                    //设置光标x为该月的起始列，y为下一行
                    Console.SetCursorPosition(((days.Month - 1) % 3) * width, ++y);
                    //在月份后打印周序
                    Console.Write("日  一  二  三  四  五  六");
                    //设置光标x为该月的起始列，y为下一行
                    Console.SetCursorPosition(((days.Month - 1) % 3) * width, ++y);
                    //对每月的第一天是星期几进行定位
                    Console.SetCursorPosition(x + DoW * 4, y);
                }
                //如果日历上有今天，那么把今天标红
                if (days.Year == DateTime.Now.Year && days.Month == DateTime.Now.Month && days.Day == DateTime.Now.Day)
                    Console.ForegroundColor = ConsoleColor.Red;
                Console.Write($"{days.ToString("dd")}  ");
                Console.ForegroundColor = ConsoleColor.White;
                //对每周六进行++y，x重置为该月的第一列
                if (DoW == 6)
                    Console.SetCursorPosition(((days.Month - 1) % 3) * width, ++y);
            }
        }
    }
}